package com.briup.pts.util;


import com.briup.pts.config.exception.ServiceException;
import com.briup.pts.config.response.ResultCode;

import java.lang.reflect.Constructor;
import java.util.function.Consumer;

/**
 * 用于断言的工具类
 */
public class AssertUtil {

    /**
     * 期望某个对象为null
     *
     * @param o       对象
     * @param message 对象不为null时，给出的消息提示
     */
    public static void requiredNull(Object o, String message) {
        if (o != null) {
            throw new ServiceException(message);
        }
    }

    /**
     * 期望某个对象为null
     *
     * @param o          对象
     * @param resultCode 对象不为null时，抛出统一响应状态
     */
    public static void requiredNull(Object o, ResultCode resultCode) {
        if (o != null) {
            throw new ServiceException(resultCode);
        }
    }

    /**
     * 期望某个对象不能为null，如果为null抛出异常
     *
     * @param o       对象
     * @param message 对象为null时，抛出的异常
     */
    public static void requiredNotNull(Object o, String message) {
        if (o == null) {
            throw new ServiceException(message);
        }
    }

    /**
     * 期望某个对象不能为null，如果为null抛出异常
     *
     * @param o          对象
     * @param resultCode 对象为null时，抛出统一响应状态
     */
    public static void requiredNotNull(Object o, ResultCode resultCode) {
        if (o == null) {
            throw new ServiceException(resultCode);
        }
    }

    /**
     * 期望文本是有数据的
     *
     * @param content 文本对象
     * @param message 文本为空时，抛出的异常消息
     */
    public static void hasText(String content, String message) {
        if (content == null || content.trim().isEmpty()) {
            throw new ServiceException(message);
        }
    }

    /**
     * 期望文本是有数据的
     *
     * @param content    文本对象
     * @param resultCode 文本为空时，抛出的异常消息
     */
    public static void hasText(String content, ResultCode resultCode) {
        if (content == null || content.trim().isEmpty()) {
            throw new ServiceException(resultCode);
        }
    }

    /**
     * 判断某个boolean表达式为true，
     * 如果为false抛出异常
     *
     * @param expression 表达式
     * @param message    抛出的异常消息
     */
    public static void isTrue(boolean expression, String message) {
        if (!expression) {
            throw new ServiceException(message);
        }
    }

    /**
     * 判断某个boolean表达式为true，
     * 如果为false抛出异常
     *
     * @param expression 表达式
     * @param resultCode 抛出的异常消息
     */
    public static void isTrue(boolean expression, ResultCode resultCode) {
        if (!expression) {
            throw new ServiceException(resultCode);
        }
    }

    /**
     * 对表达式进行校验，表达式的结果如果为false，那么抛出异常；
     * 异常的类型可以通过Consumer的accept方法指定
     *
     * @param expression boolean表示式
     * @param message    抛出异常时的消息提示
     * @return Consumer接口对象，用于接收需要抛出的异常类型
     */
    public static Consumer<Class<? extends RuntimeException>> check(boolean expression, String message) {
        if (!expression) {
            return (clazz) -> {
                try {
                    // 获取异常的有参构造器，即待message的构造器
                    Constructor<? extends RuntimeException> constructor
                            = clazz.getDeclaredConstructor(String.class);

                    // 常见异常并且 抛出本异常
                    throw constructor.newInstance(message);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            };
        }
        return (clazz) -> {
        };
    }
}
